// 判断JS对象是否存在循环引用
const obj = {
  a: 1,
  b: 2,
}

obj.c = obj

// isHasCircle函数， 存在环输出true，不存在的话输出false
console.log(isHasCircle(obj))

/**
 * 采用递归的方式
 * 一层层遍历对象的属性，将属性放到map中，如果属性存在于map中，则存在
 * @param {*} target 目标对象
 */
function isHasCircle(target) {
  let isCircle = false
  let map = new Map()
  function loop(obj) {
    Object.keys(obj).forEach((key) => {
      let value = obj[key]
      if (typeof value == 'object' && value != null) {
        if (map.has(key)) {
          isCircle = true
          return
        } else {
          map.set(key)
          loop(value)
        }
      }
    })
  }
  loop(target)
  return isCircle
}